#include <iostream>
using namespace std;

/*
	运算符重载两种表现形式：
	    形式1：运算符重载作为类的成员函数
	    形式2：运算符重载作为类的友元函数
	两者的区别:
	    区别1：运算符重载作为类的友元函数，无法通过对象来调用，因此代码中不可以使用this指针
		区别2：运算符重载作为类的友元函数，此时没有当前对象，因此传递参数的时候，参数的个数会多一个
*/

class Cat
{
public:
	Cat(int _age=0)
	{
		age=_age;
	}

	//加法重载作为猫类的成员函数
 	// int operator+(Cat &other)
	// {
		// cout<<"加法重载作为猫类的成员函数被调用了"<<endl;
		// return this->age+other.age;
	// } 
	friend int operator+(Cat &c1,Cat &c2);
private:
	int age;
};

//加法重载作为猫类的友元函数
int operator+(Cat &c1,Cat &c2)
{
	cout<<"加法重载作为猫类的友元函数被调用了"<<endl;
	return c1.age+c2.age;
} 

int main()
{
	Cat c1(5);
	Cat c2(7);
	
	//更加清晰地看到，的确是成员函数
	//int result=c1.operator+(c2);
	//cout<<"c1+c2 is: "<<result<<endl;
	
	//更加清晰地看到，的确是友元函数
	//result=operator+(c1,c2);
	//cout<<"c1+c2 is: "<<result<<endl;
	
	//换成写法1：用人类的思维习惯再来调用
	/*
		这种写法会造成冲突，这种写法跟成员函数、友元函数都能匹配
		因此这种写法下，成员函数或者友元函数只能留下了一个
	*/
	int result=c1+c2;
	cout<<"c1+c2 is: "<<result<<endl;
}